import { declare } from "./泛型";
// 上下文类型推导
type Fn = (a: number) => void;
const times = (fn: Fn, index: number): void => {
  for (let i = 0; i < index; i++) {
    fn(i);
  }
};
times((i) => {
  // i is number 是自动类型推导的，(i)=>{}这个函数是在times传递的参数中，所以i可以被推导是number类型
  console.log(i);
}, 5);
//
const fn = (a) => console.log(a); // a是any类型,因为他是单独的函数并不能进行类型推导
times(fn, 5);

/**
 * void 返回值类型下的特殊情况
 * 上下文类型对于void返回值的函数，并不会真的要求他什么都不能返回，虽然函数实现可以返回任意类型的值，但当结果调用时候，
 * 仍然是void
 */
declare let func: (raw: number) => (input: string) => void;
func = (raw) => {
  // number
  return (input) => {
    // string;
    return input; // string;
  };
};
const aad = func(1)("2222"); // aad 是void类型

let asd: string = aad; // error 不能将类型“void”分配给类型“string”

declare type fn2 = () => void;
const fn2: fn2 = () => {
  return 123;
};

const fn3 = (): void => {
  return "123";
};
